QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使う方法

QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使う方法

QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使うには、シークレットを QuickSight が有効化されているリージョンにレプリケーションし、レプリケーションしたシークレットを参照する必要があります。認証情報に Secrets Manager を使うには API での操作が必要です。
Clock Icon2024.11.10

コーヒーが好きな emi です。

QuickSight とは別リージョンの Redshift や RDS のデータを可視化する際、認証情報として Secrets Manager を使う方法を検証しました。手順を紹介します。

結論

Secrets Manager が QuickSight とは別リージョンにある場合、QuickSight が有効化されているリージョンに Secrets Manager のシークレットをレプリケーションし、そのレプリケーションされたシークレットを参照することで接続可能です。
別リージョンのシークレットを直接参照することはできないようです。

HOW-TO~1

検証

以下のブログで、東京リージョンの QuickSight から別リージョンの Redshift のデータを可視化しました。
https://dev.classmethod.jp/articles/visualize-redshift-in-another-region-from-quicksight/

上記ブログではデータセット作成時に直接パスワードを入力したのですが、認証情報を Secrets Manager で管理するようにデータソースを変更します。

1. 失敗パターン(別リージョンのシークレットを直接参照しようとした)

QuickSight で Secrets Manager へのアクセスを許可

まず、バージニア北部リージョンの Secrets Manager を開き、シークレットの ARN をコピーします。
how-to-use-secrets-manager-credentials_2

続いて QuckSight のアクセス許可設定をおこないます。QuickSight コンソールの右上人型アイコンをクリックし、[QuickSight を管理] - [セキュリティとアクセス許可] - [QuickSight の AWS のサービスへのアクセス] へ進み「管理」をクリックします。

Secrets Manager にチェックを入れ、「他のリージョンのシークレット」にコピーしたバージニア北部リージョンのシークレットの ARN を貼り付けます。
how-to-use-secrets-manager-credentials_3

「シークレットを追加」で追加して「完了」をクリックします。
how-to-use-secrets-manager-credentials_4

保存します。
how-to-use-secrets-manager-credentials_5

データソースの変更

以下ブログの通り、認証情報を Secrets Manager で管理するには API で操作する必要があります。
https://dev.classmethod.jp/articles/quicksight-data-source-secrets-manager/

AWS CLI で API 操作をするのが一番簡単なので、AWS CLI で操作していきます。

では、update-data-source コマンドでデータセットを更新します。

今回は CLI スケルトンを使います。以下のブログを参照ください。

https://dev.classmethod.jp/articles/quicksight-restricted-shared-folders-cli-skeleton/

では、以下のコマンドでスケルトンファイルのひな形を作成します。

aws quicksight update-data-source --generate-cli-skeleton > update-data-source-secrets.json

▼実行結果

[cloudshell-user@ip-10-134-29-157 ~]$ aws quicksight update-data-source --generate-cli-skeleton > update-data-source-secrets.json
[cloudshell-user@ip-10-134-29-157 ~]$

cat コマンドで update-data-source-secrets.json の中身を確認します。以下、ちょっと長いですが、今回必要な部分だけできるだけ抜き出して記載しています。

▼実行結果

[cloudshell-user@ip-10-134-29-157 ~]$ cat update-data-source-secrets.json 
{
    "AwsAccountId": "",
    "DataSourceId": "",
    "Name": "",
    "DataSourceParameters": {
        "AmazonElasticsearchParameters": {
            "Domain": ""
        },
        :
        :
        },
        :
        :
        "RedshiftParameters": {
            "Host": "",
            "Port": 0,
            "Database": "",
            "ClusterId": "",
            "IAMParameters": {
                "RoleArn": "",
                "DatabaseUser": "",
                "DatabaseGroups": [
                    ""
                ],
                "AutoCreateDatabaseUser": true
            },
            "IdentityCenterConfiguration": {
                "EnableIdentityPropagation": true
            }
        },
        :
        :
        "BigQueryParameters": {
            "ProjectId": "",
            "DataSetRegion": ""
        }
    },
    "Credentials": {
        "CredentialPair": {
            "Username": "",
            "Password": "",
            "AlternateDataSourceParameters": [
                {
                    "AmazonElasticsearchParameters": {
                        "Domain": ""
                    },
                    :
                    :
                    },
                    :
                    :
                    "RedshiftParameters": {
                        "Host": "",
                        "Port": 0,
                        "Database": "",
                        "ClusterId": "",
                        "IAMParameters": {
                            "RoleArn": "",
                            "DatabaseUser": "",
                            "DatabaseGroups": [
                                ""
                            ],
                            "AutoCreateDatabaseUser": true
                        },
                        "IdentityCenterConfiguration": {
                            "EnableIdentityPropagation": true
                        }
                    },
                    :
                    :
                    "BigQueryParameters": {
                        "ProjectId": "",
                        "DataSetRegion": ""
                    }
                }
            ]
        },
        "CopySourceArn": "",
        "SecretArn": ""
    },
    "VpcConnectionProperties": {
        "VpcConnectionArn": ""
    },
    "SslProperties": {
        "DisableSsl": true
    }
}
[cloudshell-user@ip-10-134-29-157 ~]$ 

出力された内容を見るとデータソース ID が必要であることが分かるので、list-data-sources コマンドで確認します。

aws quicksight list-data-sources \
  --aws-account-id 123456789012

▼実行結果

[cloudshell-user@ip-10-132-74-210 ~]$ aws quicksight list-data-sources \
>   -- --aws-account-id 123456789012
{
    "DataSources": [
        {
        :
        :
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/92d8a982-3cfc-465d-b5ec-xxxxx",
            "DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
            "Name": "Virginia-Redshift",
            "Type": "REDSHIFT",
            "Status": "UPDATE_SUCCESSFUL",
            "CreatedTime": "2024-11-06T14:52:52.431000+00:00",
            "LastUpdatedTime": "2024-11-08T10:28:00.671000+00:00",
            "DataSourceParameters": {
                "RedshiftParameters": {
                    "Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
                    "Port": 5439,
                    "Database": "dev"
                }
            },
            "VpcConnectionProperties": {
                "VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
            },
            "SslProperties": {
                "DisableSsl": false
            }
        },
        :
        :
        {
        :
        :
        }
    ],
    "Status": 200,
    "RequestId": "22551787-c78d-4faa-85f7-d3597b22605f"
}
[cloudshell-user@ip-10-132-74-210 ~]$

データソース ID は 92d8a982-3cfc-465d-b5ec-xxxxx であることが分かりました。ついでに VPC connection の ARN も分かります。

update-data-source-secrets.json を以下のように修正します。

update-data-source-secrets.json
{
    "AwsAccountId": "123456789012",
    "DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
    "Name": "Virginia-Redshift",
    "DataSourceParameters": {
        "RedshiftParameters": {
            "Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
            "Port": 5439,
            "Database": "dev"
        }
    },
    "Credentials": {
        "SecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx"
    },
    "VpcConnectionProperties": {
        "VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
    },
    "SslProperties": {
        "DisableSsl": false
    }
}

データソースを更新します。

aws quicksight update-data-source \
  --cli-input-json file://update-data-source-secrets.json

▼実行結果

[cloudshell-user@ip-10-134-29-157 ~]$ aws quicksight update-data-source \
>   --cli-input-json file://update-data-source-secrets.json

An error occurred (InvalidParameterValueException) when calling the UpdateDataSource operation: The SecretArn arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx must have the same partition and region as the DataSource.
[cloudshell-user@ip-10-134-29-157 ~]$ 

(機械翻訳)
UpdateDataSource 操作の呼び出し時にエラーが発生しました(InvalidParameterValueException): SecretArn arn:aws:secretsmanager:us-east-1:123456789012:secret:redshift!20241106-namespace-xxxxx は、DataSource と同じパーティションおよびリージョンでなければなりません。

2. 成功パターン

以下ドキュメントを参考に、Secrets Manager のシークレットをバージニア北部リージョンから東京リージョンにレプリケーションします。
https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/replicate-secrets.html

バージニア北部リージョンのシークレットを開き、レプリケーションタブで「シークレットを他のリージョンにレプリケート」をクリックします。
how-to-use-secrets-manager-credentials_6

東京リージョンを選択し、シークレットをレプリケートします。
how-to-use-secrets-manager-credentials_7

レプリケーションタブで、東京リージョンにレプリケートされたシークレットの ARN を確認できます。これをコピーして手元にメモしておきます。
how-to-use-secrets-manager-credentials_8

続いて、QuickSight の管理画面で、東京リージョンにレプリケートしたシークレットへのアクセス許可を追加します。
how-to-use-secrets-manager-credentials_9

バージニア北部リージョンのシークレットへのアクセス許可は削除します。「完了」をクリックします。
how-to-use-secrets-manager-credentials_10

保存します。

余談ですが、ここまでの操作が完了すると、QuickSight のサービスリンクロールである「aws-quicksight-secretsmanager-role-v0」で、東京リージョンにレプリケートされたシークレットへのアクセスを許可する IAM ポリシーが自動で設定されています。
how-to-use-secrets-manager-credentials_11

では、AWS CLI での操作に戻ります。

東京リージョンにレプリケートされたシークレットを参照するよう、以下のように update-data-source-secrets.json を修正します。

update-data-source-secrets.json
{
    "AwsAccountId": "123456789012",
    "DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
    "Name": "Virginia-Redshift",
    "DataSourceParameters": {
        "RedshiftParameters": {
            "Host": "20241106-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com",
            "Port": 5439,
            "Database": "dev"
        }
    },
    "Credentials": {
        "SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:redshift!20241106-namespace-admin-xxxxx"
    },
    "VpcConnectionProperties": {
        "VpcConnectionArn": "arn:aws:quicksight:ap-northeast-1:123456789012:vpcConnection/abbc8e73-fe7a-4db4-8954-xxxxx"
    },
    "SslProperties": {
        "DisableSsl": false
    }
}

以下のコマンドでデータソースを更新します。

aws quicksight update-data-source \
  --cli-input-json file://update-data-source-secrets.json

▼実行結果

[cloudshell-user@ip-10-132-74-210 ~]$ aws quicksight update-data-source \
>   --cli-input-json file://update-data-source-secrets.json
{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/92d8a982-3cfc-465d-b5ec-xxxxx",
    "DataSourceId": "92d8a982-3cfc-465d-b5ec-xxxxx",
    "UpdateStatus": "UPDATE_IN_PROGRESS",
    "RequestId": "38947b0d-21ec-4d61-8033-14509a4b4e36"
}
[cloudshell-user@ip-10-132-74-210 ~]$

今度はコマンドが成功しました。

データソースが修正できたか確認します。データソースの設定を確認するには、「新しいデータセット」をクリックします。(いつもここの導線が不思議だなあと思っています)
how-to-use-secrets-manager-credentials_12

画面下部までスクロールすると、既存のデータソースを選択できるようになっています。変更した Redshift のデータソースを選択して、「データソースの編集」をクリックします。
how-to-use-secrets-manager-credentials_13

「認証情報のタイプ」という項目が現れ、Secrets Manager で東京リージョンのシークレットを参照している旨が表示されました。
how-to-use-secrets-manager-credentials_14

ちなみにここで「接続を検証」をクリックすると、「パブリック API 経由でのみサポートされます」というエラーが表示されます。右上の × をクリックして戻ります。
how-to-use-secrets-manager-credentials_15

Secrets Manager を正常に参照できるのか、シークレットをローテーションしてみます。バージニア北部リージョンでシークレットを開き、ローテーションタブで「すぐにシークレットをローテーションさせる」をクリックします。
how-to-use-secrets-manager-credentials_16

「ローテーションさせる」をクリックします。
how-to-use-secrets-manager-credentials_17

ローテーションするまで数十秒 ~ 1 分程度時間がかかりました。
how-to-use-secrets-manager-credentials_18

QuickSight に戻り、分析からデータを操作してみます。この分析のデータセットは SPICE ではなくダイレクトクエリなので、データが変更できれば正常に Redshift を参照できているものと判断します。
how-to-use-secrets-manager-credentials_19

操作できています。

おわりに

QuickSight で別リージョンのシークレットへのアクセス許可が設定できたので、別リージョンのシークレットを直接参照できるのかと思ったのですが、そういうわけではないようでした。
どなたかのお役に立てば幸いです。

参考

https://dev.classmethod.jp/articles/quicksight-data-source-secrets-manager/

https://community.amazonquicksight.com/t/quicksight-secrets-manager-redshift-quicksight/38108

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/secrets-manager-integration.html

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/secrets-manager-integration-select-secrets.html

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/secrets-manager-integration-api.html

https://community.amazonquicksight.com/t/topic/27744

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.